import heapq

INF = float('inf')  # 无穷大表示没有路径
N = 100010  # 最大节点数
G = [[] for _ in range(N)]  # 邻接表
dis = [INF] * N  # 存储到每个节点的最短距离
n, m = 0, 0  # n 是节点数，m 是边的数目

def dijkstra(s):
    # 使用优先队列（堆）来实现 Dijkstra 算法
    q = []
    dis[s] = 0  # 起点的距离为 0
    heapq.heappush(q, (0, s))  # 将起点加入堆中，(距离, 节点)

    while q:
        current_dist, u = heapq.heappop(q)  # 取出最小距离的节点

        # 如果当前距离已经过时，跳过。
        # 节点u加入优先队列后，u的最短路径被更新，之前加入优先队列中的 (current_dist, u) 这个记录已经不再是最新的最短距离信息，需要跳过。
        if current_dist != dis[u]:
            continue

        # 遍历节点 u 的所有邻接边进行松弛操作
        for v, w in G[u]:
            if dis[u] + w < dis[v]:  # 如果通过 u 到 v 的路径更短
                # 更新节点的 路径
                dis[v] = dis[u] + w
                heapq.heappush(q, (dis[v], v))  # 更新距离并将节点 v 加入堆


# 输入图的节点数和边数
n, m = map(int, input().split())

# 构建图的邻接表
for _ in range(m):
    u, v, w = map(int, input().split())
    G[u].append((v, w))  # u 到 v 的边，权重为 w

# 调用 Dijkstra 算法，从节点 1 开始计算最短路径
dijkstra(1)

# 输出从节点 1 到节点 n 的最短路径，如果不可达输出 -1
if dis[n] == INF:
    print(-1)
else:
    print(dis[n])